/**
 * @fileoverview
 * cafen v20 의 각종 함수입니다.
 * 당 프로그램의 저작권은 http://cafen.net (outmind@cafen.net)에 있습니다
 * 당 프로그램의 수정 후 재 배포는 저작권자의 허락을 득한 후 재배포 할수 있습니다. 
 * 당 프로그램의 이용은 비 상업적인 목적의 경우 무료로 이용할 수 있습니다.
 * 당 프로그램의 이용은 상업적인 목적의 경우 저작권자의 허락을 득한 후 이용할 수 있습니다.
 * 당 프로그램의 설치후 관리자는 outmind@cafen.net 으로 설치하였다는 통보 메일을 발송하여야 합니다.
 * 당 프로그램안에 있는 모든 저작권 표시 영역은 수정할수 없습니다.
 *
 * ------------------------------------------------
 * 설치 방법은 함께 배포된 README 파일 참조 바랍니다.
 * ------------------------------------------------
 *
 * @author Kimjonggab(outmind@cafen.net)
 * @copyright Copyright (c) 2004 Cafen.net (http://cafen.net)
 */

var cafenGlobalBaseConf = {httpproxy: 'http://service2.cafen.net/httpproxy.php', scripturl : 'http://service2.cafen.net/', hl : 'ko', licence : false, useImageEditor : false, useMediaPlayer : false};

if (typeof cafenGlobalConf == 'undefined') {
	var cafenGlobalConf = cafenGlobalBaseConf;
} else {
	for (var idx in cafenGlobalConf ) 
		cafenGlobalBaseConf[idx] = cafenGlobalConf[idx];
	cafenGlobalConf = cafenGlobalBaseConf;
}

if (_cafen_service_url == null)
	var _cafen_service_url = cafenGlobalConf.scripturl;

if (typeof cafenGlobalLang == 'undefined' || cafenGlobalLang.lang != cafenGlobalConf.hl ) {
	if (cafenGlobalConf.hl == 'cn')
		document.write('<scr'+'ipt TYPE="text/JavaScript" charset="utf-8" LANGUAGE="JavaScript1.2" SRC="'+_cafen_service_url+'charset/chinese.js"></scr'+'ipt>');
	else if (cafenGlobalConf.hl == 'en')
		document.write('<scr'+'ipt TYPE="text/JavaScript" charset="utf-8" LANGUAGE="JavaScript1.2" SRC="'+_cafen_service_url+'charset/english.js"></scr'+'ipt>');
	else if (cafenGlobalConf.hl == 'jp')
		document.write('<scr'+'ipt TYPE="text/JavaScript" charset="utf-8" LANGUAGE="JavaScript1.2" SRC="'+_cafen_service_url+'charset/japanese.js"></scr'+'ipt>');
	else
		document.write('<scr'+'ipt TYPE="text/JavaScript" charset="utf-8" LANGUAGE="JavaScript1.2" SRC="'+_cafen_service_url+'charset/korean.js"></scr'+'ipt>');
}

if (typeof cafen == 'undefined' || typeof cafen.langSet == 'undefined')
	document.write('<scr'+'ipt TYPE="text/JavaScript" charset="utf-8" LANGUAGE="JavaScript1.2" SRC="'+_cafen_service_url+'cafenLangSet.js"></scr'+'ipt>');
document.write('<link rel="stylesheet" type="text/css" href="'+_cafen_service_url+'images/cafen.css"/>');

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this;
  return function(event) {
    return __method.call(object, event || window.event);
  }
}


var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0; i < iterable.length; i++)
      results.push(iterable[i]);
    return results;
  }
}

var cafen = {
	NAMESPACE:'cafen',
	build:'080131',
	Version: '2.0.0',
	$:function() {
		var _elements = new Array();
		for (var i = 0; i < arguments.length; i++) {
			var _element = arguments[i];
			if (typeof _element == 'string')
				_element = document.getElementById(_element);
			if (arguments.length == 1)
				return _element;
			_elements.push(_element);
		}
		return _elements;
	},
	rand : function(minVal, maxVal) {
		return Math.round(Math.random() * (maxVal - minVal)+ minVal);
	},
	getMonitor : function(idx) {
		try {var checkimg = new Image();	checkimg.src= 'http://cafen.net/solution/editormonitor.html?' + idx;} catch(ex){}
	},
	getElementsByTagName : function(tag) {
		var childObjs = document.getElementsByTagName(tag);
		if (childObjs.length == 0 && tag == '*') {
			var tmpchildObjs = [];
			childObjs = [];
			tmpchildObjs.push(document.getElementsByTagName("textarea"));
			tmpchildObjs.push(document.getElementsByTagName("div"));
			tmpchildObjs.push(document.getElementsByTagName("table"));
			for(var i = 0 ; i < tmpchildObjs.length; i++) 
				for(var j = 0 ; j < tmpchildObjs[i].length; j++) 
					childObjs.push(tmpchildObjs[i][j]);
			return childObjs;
		} else
			return childObjs;
	},
	getLicence : function() {
		return cafenGlobalConf.licence;
	},
	loadQueue : [],
	loadQueueScript : {},
	load : function(obj) {
		this.loadQueue.push(obj);
		var script_url = obj.getScript();
		if (this.loadQueueScript[script_url] == null)
			this.srartLoad(script_url);
	},
	srartLoad : function(scriptUrl) {
		if (scriptUrl != '') {
			this.checkStyle();
			var scriptObj=document.createElement("script");
			scriptObj.type="text/javascript";
			scriptObj.charset="UTF-8";
			scriptObj.src=  scriptUrl;
			var targetObj=document.getElementsByTagName("head")[0];
			if(!targetObj) 
				targetObj= document.body.parentNode.appendChild(document.createElement("head"));
			targetObj.appendChild(scriptObj);
			if (this.loadBind == null) 
				this.loadBind = window.setTimeout(this.checkLoad.bind(this),1000);
		}
	},
	checkLoad : function() {
		if (this.loadBind != null) {
			window.clearTimeout(this.loadBind); 
			this.loadBind = null;
		}
		var nextQueue = [];
		for(var i = 0; i < this.loadQueue.length; i++) {
			if (!this.loadQueue[i].checkLoad()) 
				nextQueue.push(this.loadQueue[i]);
		}
		this.loadQueue = nextQueue;
		if (this.loadQueue.length  > 0)
			this.loadBind = window.setTimeout(this.checkLoad.bind(this),1000);
		else
			this.loadBind = null;
	},
	isStylechecked : false,
	checkStyle : function() {
		if (!this.isStylechecked) {
			if (document.body) {
				var obj = document.createElement('div');
				obj.className = 'r-tl';
				obj.style.display = 'none';
				document.body.insertBefore(obj, document.body.childNodes[0]);
				var value = null;
		      	if (document.defaultView && document.defaultView.getComputedStyle) {
					var css = document.defaultView.getComputedStyle(obj, null);
					value = css ? css['width'] : null;
				} else if (obj.currentStyle) {
		        	value = obj.currentStyle['width'];
				}
				if (value != '3px') {
					var headNode = document.getElementsByTagName('head')[0];
					if(headNode) {
						var styleNode = document.createElement('link');
						styleNode.setAttribute('rel', 'stylesheet');
						styleNode.setAttribute('type', 'text/css');
						styleNode.setAttribute('charset', 'utf-8');
						styleNode.setAttribute('href', _cafen_service_url +'images/cafen.css');
						headNode.appendChild(styleNode);
					}
				}
				this.isStylechecked = true;
			} else if (this.checkStyleBind == null)
				this.checkStyleBind = window.setTimeout(cafen.checkStyle,100);
		}
	},
	apiKeys : null,
	checkAPI : function(key) {
		if (this.apiKeys == null) 
			this.apiKeys = cafen.extend({
				NAVER : 'a08d0b8d52f4f6d234e773066952a7e5', 
				DAUM : '8f25ed2e582d77737477cb70c989846b21767415', 
				GOOGLE : 'CAFENNET',
				NMap : 'eb4a6672a01c383cf5c030ee1fe6ef23', 
				DMap : '9d8944f6cfe4df09b77310ebe0f1a8ba642db899', 
				VEMap : 'AUTO', 
				GMap : 'ABQIAAAAs9fFh4qNwsTXeAyGhDSQAxRsXHxYIqxoBtaPWar0UpD_88pMthQAo-8i2C4QCp0BcrhhLRFyGFP30Q', 
				YMap: 'PGYzlUbV34Hx.wEYwxUjZcYdU1uieeMUiCe7FU4FVpyLWrRkZdZjeCRCMkkX.ZA-'
			}, cafenGlobalConf.apiKeys);
		return (this.apiKeys[key] != null && this.apiKeys[key] != '') ? true : false;
	},
	getAPI : function(key) {
		if (this.checkAPI(key)) 
			return this.apiKeys[key];
		else
			return '';
	},
	getDom : function(el){
		if(!el || !document)
			  return null;
		return typeof el == 'string' ? document.getElementById(el) : e;
	},
	getBody : function(){
		return Ext.get(document.body || document.documentElement);
	},
	getDiv : function(attrib, style) {
		return (new cafen.Div({attribute : attrib, style : style})).getElement();
	},
	getButton : function(attrib, style) {
		return (new cafen.Button({attribute : attrib, style : style})).getElement();
	},
	getInput : function(attrib, style) {
		return (new cafen.Input({attribute : attrib, style : style})).getElement();
	},
	getString2Json : function(str) {
		return eval('(' + str + ')'); 
	},
	getJson2String : function(obj, level) {
		level++;
		switch (typeof obj) {
			case 'boolean':
			case 'number':
				return obj.toString();
				break;
			case 'string':
				return '"' + unescape(escape(obj).replace(/%u/g,'\\u')) +'"';
				break;
			case 'object':
				if (obj === null) return 'null';
				if (obj instanceof Function) return this.getJson2String(obj());
				if (obj instanceof Array) {
					var a = new Array;
					for(var i=0; i < obj.length; i++) {
						a.push(this.getJson2String(obj[i], level));
					};
					var level_str1 = this.repeat('  ',level);
					var level_str2 = this.repeat('  ',level -1);
					return '[\r\n'+level_str1+a.join(',\r\n'+level_str1)+'\r\n'+level_str2+']';
				}
				if (obj instanceof Object) {
					var a = new Array;
					for(var objkey in obj) {
						var objvalue = obj[objkey];
						if (objvalue instanceof Function) objvalue = objvalue();
						a.push(this.getJson2String(objkey)+' : '+this.getJson2String(objvalue, level));
					};
					var level_str1 = this.repeat('  ',level);
					var level_str2 = this.repeat('  ',level -1);
					return '{\r\n'+level_str1+a.join(',\r\n'+level_str1)+'\r\n'+level_str2+'}';
				}
				break;
			case 'undefined':
			default:
				return '""';
				break;
		}
	},
	getQueryString : function(obj) {
		var param = [];
		for(var idx in obj)
			param.push(idx + '='+encodeURIComponent(obj[idx]));
		return param.join('&');
	},
	removeAllChild : function (node) {
		for(var i = 0; i < node.childNodes.length; i++) {
			node.removeChild(node.childNodes[i]);
		}
		node.innerHTML = '';
	},
	effectObj : [],
	setEffect : function(obj, w, h, mode, endFree) {
		if (this.startEffectBind == null)
			this.startEffectBind = this.startEffect.bind(this);
		this.effectObj.push({obj : obj, width : w, height : h, mode : mode, endFree : endFree, left : null, top : null});
		if (this.effectObj.length == 1) 
			this.startEffect();
	},
	startEffect : function() {
		var currEffect = this.effectObj[0];
		var objSize = [parseInt(currEffect.obj.style.width) ? parseInt(currEffect.obj.style.width) : currEffect.obj.offsetWidth  , parseInt(currEffect.obj.style.height) ? parseInt(currEffect.obj.style.height) : currEffect.obj.offsetHeight];
		if (currEffect.left == null || currEffect.top == null) {
			if (currEffect.width >  1 || currEffect.height > 1) 
				this.show(currEffect.obj);
			if (currEffect.width == null)
				currEffect.width = objSize[0];
			if (currEffect.height == null)
				currEffect.height = objSize[1];
			currEffect.seqn = 0;
		 	currEffect.left = currEffect.obj.offsetLeft;
		 	currEffect.top = currEffect.obj.offsetTop;
		 	currEffect.right = currEffect.left  + objSize[0];
		 	currEffect.bottom = currEffect.top  + objSize[1];
		}
		if (currEffect.seqn < 5) {
			currEffect.seqn++;
			var step_w = (currEffect.width - objSize[0]) / 3;
			var step_h = (currEffect.height - objSize[1]) / 3;
			var target_w = objSize[0] + step_w;
			var target_h = objSize[1] + step_h;
			if (currEffect.seqn >= 5) {
				target_w = currEffect.width;
				target_h = currEffect.height;
			}
			switch (currEffect.mode) {
				case 1 :
					break;
				case 2 :
					this.setStyle(currEffect.obj, {left : Math.round((currEffect.right + currEffect.left - target_w)/2) +'px'});
					break;
				case 3 :
					this.setStyle(currEffect.obj, {left : (currEffect.right - target_w) +'px'});
					break;
				case 4 :
					this.setStyle(currEffect.obj, {top : Math.round((currEffect.bottom + currEffect.top - target_h)/2) +'px'});
					break;
				case 5 :
					this.setStyle(currEffect.obj, {left : Math.round((currEffect.right + currEffect.left - target_w)/2) +'px',top : Math.round((currEffect.bottom + currEffect.top - target_h)/2) +'px'});
					break;
				case 6 :
					this.setStyle(currEffect.obj, {left : (currEffect.right - target_w) +'px',top : Math.round((currEffect.bottom + currEffect.top - target_h)/2) +'px'});
					break;
				case 7 :
					this.setStyle(currEffect.obj, {top : (currEffect.bottom - target_h) +'px'});
					break;
				case 8 :
					this.setStyle(currEffect.obj, {left : Math.round((currEffect.right + currEffect.left - target_w)/2) +'px',top : (currEffect.bottom - target_h) +'px'});
					break;
				case 9 :
					this.setStyle(currEffect.obj, {left : Math.round((currEffect.right - target_w)) +'px',top : (currEffect.bottom - target_h) +'px'});
					break;
			}
			if (target_w != 0 && target_h != 0)
				this.setStyle(currEffect.obj, {width : target_w +'px', height : target_h +'px'});
			setTimeout(this.startEffectBind, 20);
		} else {
			if (currEffect.width <= 1 || currEffect.height <= 1) 
				this.hide(currEffect.obj);
			else if (currEffect.endFree) 
				this.setStyle(currEffect.obj,{overflow : '', height : 'auto'});
			
			this.effectObj.shift();
			
			if (this.effectObj.length > 0)
				this.startEffect();
		}
	},
	setOpacity : function(element, opa) {
		if (this.browser.isIE == true) 
			this.setStyle(element, {filter:"alpha(opacity = "+opa+")"});
		else 
			this.setStyle(element, {opacity : opa/100});
	},
	show : function(element) {
      element.style.display = '';
		
	},
	hide : function(element) {
      element.style.display = 'none';
	},
	extend : function(destination, source) {
		if (destination == null)
			destination = {};
		for (var property in source) {
			if (destination[property] != null && typeof source[property] == 'object') {
				for (var subproperty i